Vite Runner: 使用 Vite Environment API 运行 TypeScript 文件的现代化方案
背景
随着 vite-node 宣布完成使命并推荐使用 Vite 原生的 Environment API,以及 tsx 等传统方案在 Vite 项目中的局限性,我们探索并实现了一种基于 Vite Environment API 的 TypeScript 运行时方案。
核心思路
利用 Vite 的 ssrLoadModule API,创建临时的 Vite 服务器实例来即时编译和执行 TypeScript 文件,无需预先编译步骤。
实现方案
核心代码
javascript
#!/usr/bin/env node
import { createServer } from 'vite'
/**
* 使用 Vite 运行 TypeScript 文件
*/
async function runTypeScriptFile(filePath) {
// 创建 Vite 服务器
const server = await createServer({
configFile: false, // 不使用配置文件,简化设置
server: { hmr: false }, // 禁用 HMR
optimizeDeps: {
noDiscovery: true,
include: undefined
}, // 禁用依赖优化
clearScreen: false,
logLevel: 'silent', // 静默模式
})
try {
// 使用 Vite 的 SSR 功能加载并执行模块
await server.ssrLoadModule(filePath)
} finally {
// 清理资源
await server.close()
}
}
/**
* CLI 主函数
*/
async function main() {
const args = process.argv.slice(2)
if (args.length === 0) {
process.exit(1)
}
const filePath = args[0]
try {
await runTypeScriptFile(filePath)
} catch (error) {
process.exit(1)
}
}
// 运行主函数
main().catch(() => {})
使用方式
1. 作为项目脚本
bash
# 保存为 run-ts.js
node run-ts.js src/example.ts
# 或在 package.json 中添加命令
{
"scripts": {
"run": "node run-ts.js"
}
}
2. 命令行使用
bash
pnpm run run src/example.ts
技术优势
与现有方案对比
| 特性 | tsx | vite-node | Vite Runner (我们的方案) |
| 安装 | npm install tsx | npm install vite-node | 内置 Vite |
| 配置 | 简单 | 简单 | 极简 |
| 性能 | 良好 | 良好 | 优秀 |
| 插件生态 | 有限 | Vite 插件 | 完整 Vite 生态 |
| 未来支持 | 持续维护 | 已废弃 | 官方推荐方向 |
| 项目一致性 | 独立工具 | 独立工具 | 与 Vite 项目完全一致 |
核心特性
✅ 零配置: 无需额外配置即可运行
✅ 类型安全: 完整的 TypeScript 支持
✅ ESM 支持: 现代 ES 模块语法
✅ 异步支持: 支持 async/await
✅ 依赖解析: 自动解析 node_modules 依赖
✅ 静默执行: 无多余日志输出
✅ Vite 生态: 完全兼容 Vite 插件和配置
适用场景
最佳使用场景
复杂插件需求: 需要 Vue、React、CSS 预处理器等支持
不适合的场景
前景展望
作为 npm 包的可能性
bash
# 包名建议
vite-run
vite-ts-runner
@vite/runner
# 用户使用
npm install -D vite-run
vite-run src/script.ts
包结构设计
vite-run/
├── package.json # 包配置,包含 bin 字段
├── bin/
│ └── vite-run.js # CLI 入口点
├── src/
│ └── index.ts # 核心 API
├── dist/ # 编译输出
└── README.md # 使用文档
高级功能扩展
1.
监听模式: vite-run --watch script.ts
技术实现细节
关键 API
createServer(): 创建 Vite 服务器实例
ssrLoadModule(): 加载并执行模块
性能考虑
错误处理
结论
这个方案填补了 vite-node 退役后的空白,为 Vite 项目提供了现代化的 TypeScript 运行时解决方案。虽然目前是自实现,但其技术方向与 Vite 官方推荐一致,具有很好的发展前景。
对于已经在使用 Vite 的项目,这是一个比 tsx 更合适的选择,能够保持工具链的一致性和完整性。
下一步计划
这是一个探索性的技术方案,代表了 TypeScript 运行时工具在 Vite 生态中的发展方向。